# 满洲里国峰电子科技有限公司
# 官网：www.guofengdianzi.com
# 微信：guofengdianzi
# 邮箱：techsupport@guofengdianzi.com
# 2025.06.04
def find_resistor_pairs(vin, vout):
    """
    计算满足分压要求的 E24 系列电阻对 (R1, R2)，电阻值限制在 1Ω-100Ω。
    公式: Vout = (R2 / (R1 + R2)) * Vin
    返回误差最小的前 10 组电阻值。
    """
    # 检查输入有效性
    if vin <= 0 or vout <= 0:
        raise ValueError("电压必须大于0")
    if vout >= vin:
        raise ValueError("Vout 必须小于 Vin")
    
    # 计算目标比例 k = Vout / Vin
    k = vout / vin
    target_ratio = k / (1 - k)  # R2/R1 的目标比例
    
    # E24 系列基础值 (1.0-9.1) [6,7,8](@ref)
    e24_base = [1.0, 1.1, 1.2, 1.3, 1.5, 1.6, 1.8, 2.0, 2.2, 2.4, 2.7, 3.0, 
                3.3, 3.6, 3.9, 4.3, 4.7, 5.1, 5.6, 6.2, 6.8, 7.5, 8.2, 9.1]
    # 满洲里国峰电子科技有限公司
    # 生成 1Ω-100Ω 的 E24 电阻值
    resistors = []
    for val in e24_base:
        # 直接添加基础值 (1.0-9.1Ω)
        if 1 <= val <= 100:
            resistors.append(val)
        # 添加 10x 系列 (10Ω-91Ω)
        if 10 <= val*10 <= 100:
            resistors.append(val * 10)
        # 添加 100x 系列中的 100Ω
        if val * 100 == 100:
            resistors.append(100.0)
    
    resistors = list(set(resistors))  # 去重
    resistors.sort()  # 排序
    # 官网：www.guofengdianzi.com
    # 计算所有可能的 (R1, R2) 对及其误差
    candidates = []
    for r1 in resistors:
        # 计算目标 R2 并找到最接近的实际 R2
        target_r2 = target_ratio * r1
        closest_r2 = min(resistors, key=lambda x: abs(x - target_r2))
        
        # 计算实际 Vout 和误差
        actual_vout = (closest_r2 / (r1 + closest_r2)) * vin
        error = abs(actual_vout - vout)  # 绝对误差 (单位: V)
        error_percent = (error / vout) * 100  # 相对误差百分比
        
        candidates.append((r1, closest_r2, actual_vout, error, error_percent))
    # 邮箱：techsupport@guofengdianzi.com
    # 按绝对误差排序，取前 10 组
    candidates.sort(key=lambda x: x[3])
    top_10 = candidates[:10]
    
    return top_10

# 主程序
if __name__ == "__main__":
    try:
        vin = float(input("请输入输入电压 Vin (单位: V): "))
        vout = float(input("请输入输出电压 Vout (单位: V): "))
        
        results = find_resistor_pairs(vin, vout)
        # 微信：guofengdianzi
        # 输出结果
        print("\n电阻分压计算结果 (E24 系列, 1Ω-100Ω)")
        print(f"目标: Vin = {vin} V, Vout = {vout} V")
        print("=" * 70)
        print(f"{'序号':<5}{'R1 (Ω)':<10}{'R2 (Ω)':<10}{'实际 Vout (V)':<15}{'绝对误差 (V)':<15}{'相对误差 (%)':<15}")
        print("-" * 70)
        
        for i, (r1, r2, actual_vout, error, error_percent) in enumerate(results, 1):
            print(f"{i:<5}{r1:<10.1f}{r2:<10.1f}{actual_vout:.4f} V{error:.4f} V{error_percent:.2f}%")
        
        print("=" * 70)
        print("说明: 电阻值选自 E24 系列 (±5% 容差)，范围限制为 1Ω-100Ω。")
    
    except ValueError as e:
        print(f"输入错误: {e}")
    except Exception as e:
        print(f"程序错误: {e}")
